package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.common.MessageConst;
import com.itheima.dao.MemberDao;
import com.itheima.dao.OrderDao;
import com.itheima.dao.OrderSettingDao;
import com.itheima.entity.Result;
import com.itheima.pojo.Member;
import com.itheima.pojo.Order;
import com.itheima.pojo.OrderSetting;
import com.itheima.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

@Service
@Slf4j
public class OrderServiceImpl implements OrderService {

    @Autowired
    OrderSettingDao orderSettingDao;

    @Autowired
    MemberDao memberDao;

    @Autowired
    OrderDao orderDao;

    /**
     * 1.判断选择的日期是否存在
     *    如果不存在 直接报错
     *    如果存在 判断该日期的已预约人数是否 大于或者等于可预约人数
     *         如果大于或者等于 直接报错 该日期已经满了
     *         如果小于 就可以进行下一步操作
     *             如果该用户不是会员 进行预约 并保存会员信息
     *             判断该用户有没有预约了同一天同一套餐（要查询用户是否是会员 因为第一次预约就会注册会员 如果不是会员 肯定没有预约过）
     *             如果预约了 报错不能重复预约
     *                 最后如果预约成功 该日期已预约数+1
     *
     */
    @Override
    public Result addOrderData(Map<String, String> map) throws ParseException {

        String name = map.get("name");      //用户姓名
        String sex = map.get("sex");        // 用户性别
        String idCard = map.get("idCard");   // 用户身份证号
        String setmealId = map.get("setmealId");   //所选套餐Id
        String telephone = map.get("telephone");   //用户手机号
        String orderDateStr = map.get("orderDate");  //用户所选的体检日期

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date orderDate = sdf.parse(orderDateStr);

        //判断用户所选的日期存在不存在
        OrderSetting orderSetting = orderSettingDao.findByOrderDate(orderDate);

        if (orderSetting == null){
            return new Result(false, MessageConst.SELECTED_DATE_CANNOT_ORDER);
        }

        //判断这天有没有预约满人
        if (orderSetting.getReservations()>=orderSetting.getNumber()){
            return new Result(false,MessageConst.ORDER_FULL);
        }

        //判断用户是不是会员  是不是会员代表此用户有没有体检过
        Member member = memberDao.findByTelephone(telephone);

        if (member!=null){
            //有会员
            //查询order表 有没有 此用户 同一天 同一套餐的预约
            Order order2 = new Order();
            order2.setMemberId(member.getId());
            order2.setOrderDate(orderDate);
            order2.setSetmealId(Integer.parseInt(setmealId));
            Integer count = orderDao.findCountInOrder(order2);
            if (count>0){
                return new Result(false,MessageConst.HAS_ORDERED);
            }

        }else {
            //没有会员
            member = new Member();
            member.setName(name);
            member.setSex(sex);
            member.setIdCard(idCard);
            member.setPhoneNumber(telephone);
            member.setRegTime(new Date());

            memberDao.add(member);
        }

        Order order = new Order();
        order.setMemberId(member.getId());
        order.setOrderDate(orderDate);
        order.setOrderType(Order.ORDERTYPE_WEIXIN);
        order.setSetmealId(Integer.parseInt(setmealId));
        order.setOrderStatus(Order.ORDERSTATUS_NO);
        orderDao.add(order);


        orderSetting.setReservations(orderSetting.getReservations()+1);
        orderSettingDao.updateReservations(orderSetting);

        return new Result(true,MessageConst.ORDER_SUCCESS,order);
    }


    /**
     *  已知条件  预约信息表里的id
     *  需要找到  会员的姓名 套餐的名称  和体检日期 预约类型
     *
     *  1.
     * @param id
     * @return
     */
    @Override
    public Map findById(Integer id) {
        Map map = orderDao.findById(id);
        return map;
    }
}
